#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Component {
 public:
  string name;
  Component(string name) { this->name = name; }

  virtual void add(Component *) = 0;
  virtual void remove(Component *) = 0;
  virtual void display(int) = 0;
};

class Leaf : public Component {
 public:
  Leaf(string name) : Component(name){};
  void add(Component *c) { cout << "leaf cannot add" << endl; }

  void remove(Component *c) { cout << "leaf cannot remove" << endl; }

  void display(int depth) {
    string str(depth, '-');
    str += name;
    cout << str << endl;
  }
};

class Composite : public Component {
 private:
  vector<Component *> component;

 public:
  Composite(string name) : Component(name) {}

  void add(Component *c) { component.push_back(c); }

  void remove(Component *c) {
    vector<Component *>::iterator iter = component.begin();
    while (iter != component.end()) {
      if (*iter == c) {
        component.erase(iter);
      }
      ++iter;
    }
  }

  void display(int depth) {
    string str(depth, '+');

    str += name;
    cout << str << endl;

    vector<Component *>::iterator iter = component.begin();
    while (iter != component.end()) {
      (*iter)->display(depth + 2);
      ++iter;
    }
  }
};

int main(int argc, char const *argv[])
{
    Component *p = new Composite("小李");
    p->add(new Leaf("小王"));
    p->add(new Leaf("小强"));

    Component *sub = new Composite("小虎");
    sub->add(new Leaf("小曹"));
    sub->add(new Leaf("小明"));
    sub->add(new Leaf("小柳"));

    p->add(sub);
    p->display(2);

    cout << "################################00000" << endl;
    sub->display(2);
    return 0;
}
